<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /**
     * 面试题：从一个url地址到最终页面渲染完成，发生了什么？
     *
     *  1、DNS解析：将域名地址解析为ip地址
     *      -   读取浏览器DNS缓存
     *      -   系统DNS缓存
     *      -   路由器DNS缓存
     *      -   网络运营商DNS缓存
     *      -   递归搜索：blog.baidu.com
     *          -   .com域名下查找DNS解析
     *          -   .baidu域名下查找DNS解析
     *          -   blog域名下查找DNS解析
     *          -   出错了
     *  2、TCP连接：TCP三次握手
     *      -   第一次握手，由浏览器发起，告诉服务器我要发送请求了
     *      -   第二次握手，由服务器发起，告诉浏览器我准备接收了，赶紧发送吧
     *      -   第三次握手，由浏览器发起，告诉服务器我准备发送了，准备接收吧
     *  3、发送请求
     *      -   请求报文：HTTP协议的通信内容
     *  4、接受响应
     *      -   响应报文
     *  5、渲染页面
     *      -   遇见HTML标记，浏览器调用HTML解析器解析成Token并构建成dom树
     *      -   遇见style/link标记，浏览器调用css解析器，处理css标记并构建cssom树
     *      -   遇见script记，浏览器调用javascript解析器，处理script代码(绑定事件，修改dom树/cssom树)
     *      -   将dom树和cssom树合并成一个渲染树
     *      -   根据渲染树来计算布局，计算每个节点的几何信息(布局)
     *      -   将各个节点颜色会知道屏幕上(渲染)
     *
     *  注意：
     *      这个五个步骤不一定按照顺序执行，如果dom树或cssom树被修改了，可能会执行多次布局和渲染，往往实际页面中，这些步骤都会执行多次的。
     *
     *  6、断开连接：TCP四次挥手
     *      -   第一次挥手：由浏览器发起，发送给服务器，我东西发送完了(请求报文)，你准备关闭吧
     *      -   第二次挥手：由服务器发起，告诉浏览器，我东西接收完了(请求报文)，我准备关闭了，你也准备吧
     *      -   第三次挥手：由服务器发起，告诉浏览器，我东西发送完了(响应报文)，你准备关闭吧
     *      -   第四次挥手：由浏览器发起，告诉服务器，我东西接受完了，我准备关闭了(响应报文)，你也准备吧
     */
</script>
</body>
</html>
